<?php
/**
 * @see Zend_Form_Element_Multi
 */
require_once "Zend/Form/Element/Multi.php";

/**
 * Элемент формы, реализующий выбор разделов сайта
 * В зависимости от переданных опций может быть Select, MultiSelect, Radio, MultiCheckbox
 * Список категорий накидывается автоматически
 * 
 * @category Phorm
 * @package Form_Element
 * @name /Phorm/Form/Element/Categories.php
 * @copyright phorm.ru
 * @since 06.03.2012
 * @author vladimir@kachalov.net
 * @todo Добавить проверку прав доступа
 */

class Phorm_Form_Element_Categories extends Zend_Form_Element_Multi {
	
	public $helper = "formCategories";
	
	protected $_isArray = false;

	
	/**
	 * Определяем массив разделов и дергаем родительский конструктор
	 *
	 * @param mixed $spec
	 * @param array $options
	 */
	
	public function __construct($spec, $options = null) {
		
		/**
		 * Определяем тип элемента
		 * select, radio - одиночный выбор
		 * multiselect, checkbox - множественный выбор
		 */
		
		$this->type = isset($options['type']) 
			&& in_array(strtolower($options['type']),array('select','multiselect','checkbox','radio'))
				? strtolower($options['type'])
				: 'select';
				
		if($this->type=='multiselect') {
			$this->_isArray = true;
			$this->multiple = 'multiple';
		}
		
		if($this->type=='checkbox') $this->_isArray = true;
		
		/**
		 * Переопределяем помощник вида при использовании Canonical и чекбоксов
		 */
		
		if($this->type=='checkbox' && isset($options['usecanonical']) && $options['usecanonical']==true) {
			$this->helper = 'selectCanonical'; // Враппер к formCategories с добавлением JQuery-логики
		}
		
		/**
		 * Манипуляция с разделами
		 */
		
		require_once "Phorm/Categories.php";
		
		$Categories = new Phorm_Categories();
		
		/**
		 * Получаем список разделов
		 */
		
		if(isset($options['moduleid'])) {
			$CategoriesList = $Categories->getCategoriesPathsByModule($options['moduleid']);
		} else {
			$CategoriesList = $Categories->getList();
		}
		
		/**
		 * Собираем массив пар для мультиопций
		 */
		
		$pairs = isset($options['multioptions']) && is_array($options['multioptions']) ? $options['multioptions'] : array();
		
		foreach ($CategoriesList as $category) {
			if(isset($options['moduleid']) && $category['moduleid']!=$options['moduleid']) continue;
			$pairs[$category['categoryid']] = $category['categoryname'];
		}
		
		/**
		 * Добавляем разделы для визуализации вложенности в хелпере
		 */
		
		if(isset($options['multioptions']) && is_array($options['multioptions'])) {
			// Унифицируем опции, заданные в конфигурационном файле формы
			foreach ($options['multioptions'] as $key=>$val) {
				if(is_string($val) && is_string($key)) {
					$options['multioptions'][$key] = array(
						'categoryid' => $key,
						'categoryname' => $val,
						'clevel' => 0,
						'visible' => 'yes',
					);
				}
			}
			$options['categories'] = $options['multioptions'] + $CategoriesList;
		} else {
			$options['categories'] = $CategoriesList;
		}
		
		/**
		 * Добавляем мультиопции для валидации
		 */
		
		$options['multioptions'] = $pairs;
		
		/**
		 * Инициализируем родительский конструктор
		 */
		
		parent::__construct($spec, $options);
		
	}
	
}